package py.fpuna.ii.electiva2.eao;

import java.util.ArrayList;
import java.util.Iterator;
import py.fpuna.ii.electiva2.interfaces.ClienteEAORemote;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import py.fpuna.ii.electiva2.entity.Cliente;
import py.fpuna.ii.electiva2.dto.ClienteDTO;
import py.fpuna.ii.electiva2.interfaces.ClienteEAO;

/**
 *
 * @author lizg
 */
@Stateless
public class ClienteEAOBean implements ClienteEAO, ClienteEAORemote {
    @PersistenceContext
    private EntityManager em;

    public String create(ClienteDTO cliente) {
        Cliente entidad = null;
        String retorno = null;

        try{
            entidad = new Cliente();
            entidad.setClieApellido(cliente.getClieApellido());
            entidad.setClieCi(cliente.getClieCi());
            entidad.setClieCodigo(cliente.getClieCodigo());
            entidad.setClieDireccion(cliente.getClieDireccion());
            entidad.setClieNombre(cliente.getClieNombre());
            entidad.setClieRuc(cliente.getClieRuc());
            entidad.setVentaCollection(null);

            em.persist(entidad);
            
            retorno = "OK";
        }
        catch (Exception e){
            e.printStackTrace();
            retorno = e.getMessage();
	}

	return retorno;
    }

    public void edit(ClienteDTO cliente) {

        Cliente entidad = new Cliente(cliente.getClieCodigo(),
                cliente.getClieNombre(), 
                cliente.getClieApellido(), 
                cliente.getClieCi(),
                cliente.getClieDireccion(),
                cliente.getClieRuc()
        );

        Cliente clientemng = em.merge(entidad);
        em.merge(clientemng);
    }

    public void remove(ClienteDTO cliente) {
        Cliente entidad = new Cliente(cliente.getClieCodigo(),
                cliente.getClieNombre(),
                cliente.getClieApellido(),
                cliente.getClieCi(),
                cliente.getClieDireccion(),
                cliente.getClieRuc()
        );
        Cliente clientmng = em.merge(entidad);
        em.remove(clientmng);
    }

    public ClienteDTO find(Integer id) {
        ClienteDTO retorno = null;
        Cliente entidad = new Cliente();
        try {
            Query q = em.createNamedQuery("Cliente.findByClieCodigo").setParameter("clieCodigo", id);
            entidad = (Cliente)q.getSingleResult();
            retorno = new ClienteDTO(entidad.getClieCodigo(),
                    entidad.getClieNombre(),
                    entidad.getClieApellido(),
                    entidad.getClieCi(),
                    entidad.getClieDireccion(),
                    entidad.getClieRuc()
            );
        } catch (Exception e) {
            throw e;
        }finally{
            return retorno;
        }

    }

    public Cliente findE(Integer id) {
        Cliente entidad = new Cliente();
        try {
            Query q = em.createNamedQuery("Cliente.findByClieCodigo").setParameter("clieCodigo", id);
            entidad = (Cliente)q.getSingleResult();

        } catch (Exception e) {
            throw e;
        }finally{
            return entidad;
        }

    }

    public List<ClienteDTO> findAll() {
        List<Cliente> clientList = em.createQuery("select object(o) from Cliente as o").getResultList();
        
        List<ClienteDTO> clientdtoList = new ArrayList<ClienteDTO>();
        
        Iterator <Cliente> itClie = clientList.iterator();

        while(itClie.hasNext()){
            Cliente clie = itClie.next();
            ClienteDTO cliedto = new ClienteDTO();

            cliedto.setClieNombre(clie.getClieNombre());
            cliedto.setClieApellido(clie.getClieApellido());
            cliedto.setClieCi(clie.getClieCi());
            cliedto.setClieDireccion(clie.getClieDireccion());
            cliedto.setClieRuc(clie.getClieRuc());
            cliedto.setClieCodigo(clie.getClieCodigo());

            clientdtoList.add(cliedto);
        }

        return clientdtoList;
    }


    /**
     * busca clientes segun un criterio
     * @param condicion
     * @return lista de clientes q cumplen la condicion
     * @throws Exception
     */
     public List<ClienteDTO> getListaCliente(String condicion) {
        List<ClienteDTO> retorno = null;
        List<Cliente> clientList = null; //para guardar resultado del em
        Query q = null;
        try {
            if(condicion == null || condicion.length() == 0){
                retorno = this.findAll();
            }else{
                String regexp = "%"+condicion+"%";  //busca todo lo que empiece con "condicion"
                q = em.createQuery("select c from Cliente c WHERE lower(c.clieNombre) LIKE ?1 ").setParameter(1, regexp);
            }
            // recuperamos la lista
            clientList = q.getResultList();

            Iterator <Cliente> itClie = clientList.iterator();

            retorno = new ArrayList<ClienteDTO>();

            while(itClie.hasNext()){
                Cliente clie = itClie.next();
                ClienteDTO cliedto = new ClienteDTO();

                cliedto.setClieNombre(clie.getClieNombre());
                cliedto.setClieApellido(clie.getClieApellido());
                cliedto.setClieCi(clie.getClieCi());
                cliedto.setClieDireccion(clie.getClieDireccion());
                cliedto.setClieRuc(clie.getClieRuc());
                cliedto.setClieCodigo(clie.getClieCodigo());

                retorno.add(cliedto);
            }

        } catch (Exception e) {
            throw e;
        }finally{
            return retorno;
        }
    }



}
